// 使用 AES 算法进行对称加解密
import CryptoJS from "crypto-js";
import * as CookieJS from "./cookie.js";
import html2pdf from "html2pdf.js";

// 示例使用
export const key = "1234567890123456abcdefghijopqrst"; // 32 字节的密钥
export const iv = "abcdef9876543210"; // 16 字节的初始化向量
// 对称加密函数
export function encrypt(plainText, key, iv) {
  // 将密钥和iv转换为 CryptoJS 格式
  const keyUtf8 = CryptoJS.enc.Utf8.parse(key);
  const ivUtf8 = CryptoJS.enc.Utf8.parse(iv);

  // 使用 AES 加密
  const encrypted = CryptoJS.AES.encrypt(plainText, keyUtf8, {
    iv: ivUtf8,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7,
  });

  // 返回加密后的字符串（使用 Base64 编码） 注：默认情况下返回的数据就是base64编码的
  return encrypted.toString();
}

// 对称解密函数
export function decrypt(encryptedText, key, iv) {
  // 将密钥和iv转换为 CryptoJS 格式
  const keyUtf8 = CryptoJS.enc.Utf8.parse(key);
  const ivUtf8 = CryptoJS.enc.Utf8.parse(iv);

  // 使用 AES 解密
  const decrypted = CryptoJS.AES.decrypt(encryptedText, keyUtf8, {
    iv: ivUtf8,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7,
  });

  // 将解密后的结果转换为明文（UTF-8 字符串）
  return decrypted.toString(CryptoJS.enc.Utf8);
}

// 获取token信息
export function getToken() {
  let token = "";
  token = CookieJS.getCookie("dynamic-token");
  if (IsNullOrEmpty(token)) token = localStorage.getItem("token");
  if (IsNullOrEmpty(token)) token = sessionStorage.getItem("token");
}

export function IsNullOrEmpty(str) {
  if (str === "" || str === null || str === undefined) return true;
  return false;
}

export function Base64Encoding(str) {
  let wordArray = CryptoJS.enc.Utf8.parse(str);
  return CryptoJS.enc.Base64.stringify(wordArray);
}

export function Base64Decoding(base64Str) {
  let wordArray = CryptoJS.enc.Base64.parse(base64Str);
  return CryptoJS.enc.Utf8.stringify(wordArray);
}

// ---------- CommonJS 方式 ----------
// const utils = require('./utils');  // 导入整个模块
//    使用时：
//          console.log(utils.key);   // 访问 key
//          console.log(utils.encrypt);  // 访问 encrypt
// module.exports = {
//     key,
//     iv,
//     encrypt,
//     decrypt,
//     getToken
// };

// ---------- ES6 方式 ----------
// 方式一：export导出，导入使用时，是这种方式 import { key,iv,encrypt,decrypt,getToken,IsNullOrEmpty } from 'tools.js'
//    使用时：直接使用方法或属性名称即可
// export {
//     key,iv,encrypt,decrypt,getToken,IsNullOrEmpty
// }

// 方式二：export default方式导出，导入使用时 import utils from './utils'
//    使用时： utils.key,utils.iv,utils.encrypt(参数);
// export default {
//       key,
//       iv,
//       encrypt,
//       decrypt,
//       getToken
// }
